package com.colorfruit.framework.common.util;

import com.colorfruit.framework.model.sys.ValidationResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.HashMap;
import java.util.Set;

/**
 * 业务描述：
 *
 * @Auther: chenjiayuan
 * @Date: create in 2018/7/6 14
 * @Description:
 *
 * 注解作用列表：
 * （1）Bean Validation 中内置的 constraint
 * @Null   被注释的元素必须为 null
 * @NotNull    被注释的元素必须不为 null
 * @AssertTrue     被注释的元素必须为 true
 * @AssertFalse    被注释的元素必须为 false
 * @Min(value)     被注释的元素必须是一个数字，其值必须大于等于指定的最小值
 * @Max(value)     被注释的元素必须是一个数字，其值必须小于等于指定的最大值
 * @DecimalMin(value)  被注释的元素必须是一个数字，其值必须大于等于指定的最小值
 * @DecimalMax(value)  被注释的元素必须是一个数字，其值必须小于等于指定的最大值
 * @Size(max=, min=)   被注释的元素的大小必须在指定的范围内
 * @Digits (integer, fraction)     被注释的元素必须是一个数字，其值必须在可接受的范围内
 * @Past   被注释的元素必须是一个过去的日期
 * @Future     被注释的元素必须是一个将来的日期
 * @Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式
 * （2）Hibernate Validator 附加的 constraint
 * @NotBlank(message =)   验证字符串非null，且长度必须大于0
 * @Email  被注释的元素必须是电子邮箱地址
 * @Length(min=,max=)  被注释的字符串的大小必须在指定的范围内
 * @NotEmpty   被注释的字符串的必须非空
 * @Range(min=,max=,message=)  被注释的元素必须在合适的范围内
 */
@Slf4j
public class ValidationUtil {
    private static Validator validator =  Validation.buildDefaultValidatorFactory().getValidator();
    public static <T> ValidationResult validateEntity(T obj){
        ValidationResult result = new ValidationResult(false,new HashMap<String,String >());
        Set<ConstraintViolation<T>> set = validator.validate(obj,Default.class);
        if( !CollectionUtils.isEmpty(set) ){
            result.setHasErrors(true);
            for(ConstraintViolation<T> cv : set){
                result.getErrorMsg().put(cv.getPropertyPath().toString(), cv.getMessage());
            }
        }
        return result;
    }

    public static <T> ValidationResult validateProperty(T obj,String propertyName){
        ValidationResult result = new ValidationResult(false,new HashMap<String,String>());
        Set<ConstraintViolation<T>> set = validator.validateProperty(obj,propertyName,Default.class);
        if( !CollectionUtils.isEmpty(set) ){
            result.setHasErrors(true);
            for(ConstraintViolation<T> cv : set){
                result.getErrorMsg().put(propertyName, cv.getMessage());
            }
        }
        return result;
    }
}
